home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 15
/
Aminet 15 - Nov 1996.iso
/
Aminet
/
text
/
hyper
/
hsc_source.lha
/
source
/
hsc
/
callback.c
< prev
next >
Wrap
C/C++ Source or Header
|
1996-09-09
|
8KB
|
336 lines
/*
* hsc/callback.c
*
* callbacks of hsc for hsclib
*
* Copyright (C) 1995,96 Thomas Aglassinger <agi@sbox.tu-graz.ac.at>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
* updated: 9-Sep-1996
* created: 17-Mar-1996
*
*/
#include "hsc/global.h"
#include "hsc/output.h"
#include "hsc/status.h"
#include "ugly/returncd.h"
#define NOEXTERN_HSC_CALLBACK_H
#include "hsc/callback.h"
/*
* defines for ANSI-sequences
*/
#define ANSI_RESET "\033[0m"
#define ANSI_BOLD "\033[1m"
#define ANSI_ITALIC "\033[3m"
#define ANSI_UNDERLINE "\033[4m"
#define ANSI_INVERT "\033[7m"
#define ANSI_TEXT_BACKGR "\033[30m"
#define ANSI_TEXT_SHADOW "\033[31m"
#define ANSI_TEXT_HILITE "\033[32m"
#define ANSI_TEXT_STRESS "\033[31m"
static FILE *msgfile = NULL;
/*
* hsc_nomem_handler
*
* called from ugly/umemory/umalloc(), if malloc() did return NULL
*/
BOOL hsc_nomem_handler( size_t size )
{
status_error( "out of memory" );
return_code = RC_FAIL;
exit( return_code );
return( FALSE ); /* immediatly abort */
}
/*
* message
*
* hsc-callback to display message coming from parser
*/
static VOID message(HSCPRC *hp,
HSCMSG_CLASS msg_class, HSCMSG_ID msg_id,
STRPTR fname, ULONG x, ULONG y,
STRPTR msg_text)
{
STRPTR msg_class_str = "*UNKNOWN*";
STRPTR msg_class_seq = ANSI_BOLD;
STRPTR msgfmt = msg_format;
if ( !msgfmt )
#if 1
msgfmt = "%f (%y,%x): %c %i: %m"; /* hsc format */
#else
msgfmt = "%f:%y: %c %i: %m"; /* 'gcc' format */
#endif
switch ( msg_class ) {
case MSG_NOTE:
msg_class_str = "Note";
break;
case MSG_STYLE:
msg_class_str = "Bad style";
break;
case MSG_PORT:
msg_class_str = "Portability problem";
break;
case MSG_WARN:
msg_class_str = "Warning";
break;
case MSG_ERROR:
msg_class_str = "Error";
msg_class_seq = ANSI_BOLD ANSI_TEXT_HILITE;
break;
case MSG_FATAL:
msg_class_str = "Fatal error";
msg_class_seq = ANSI_BOLD ANSI_TEXT_HILITE;
break;
}
/* update returncode if necessary */
if ( msg_class == MSG_WARN )
set_return_code( RC_WARN );
else if ( msg_class == MSG_ERROR )
set_return_code( RC_ERROR );
else if ( msg_class == MSG_FATAL )
set_return_code( RC_FAIL );
/* couldn't open include file */
if ( !fname )
{
fname = estr2str( inpfilename );
x = 1; y = 1;
}
clr_estr( msgbuf );
while ( msgfmt[0] )
{
if ( msgfmt[0]=='%' )
{
msgfmt++;
switch ( msgfmt[0] )
{
case 'c':
if (msg_ansi)
app_estr(msgbuf, msg_class_seq);
app_estr( msgbuf, msg_class_str );
if (msg_ansi)
app_estr(msgbuf, ANSI_RESET);
break;
case 'f':
app_estr( msgbuf, fname );
break;
case 'i':
if (msg_ansi)
app_estr(msgbuf, msg_class_seq);
app_estr( msgbuf, long2str( msg_id ) );
if (msg_ansi)
app_estr(msgbuf, ANSI_RESET);
break;
case 'm':
app_estr( msgbuf, msg_text );
break;
case 'n':
app_estrch( msgbuf, '\n' );
break;
case 'x':
app_estr( msgbuf, long2str( x ) );
break;
case 'y':
app_estr( msgbuf, long2str( y ) );
break;
default :
app_estrch( msgbuf, '%' );
app_estrch( msgbuf, msgfmt[0] );
break;
}
}
else
{
app_estrch( msgbuf, msgfmt[0] );
}
msgfmt++;
}
app_estrch( msgbuf, '\n' ); /* append LF */
fputs( estr2str( msgbuf ), msgfile );
D(
if ( msgfile != stderr )
fprintf( stderr, DHSC "msg `%s (%ld,%ld): %s %ld: %s'\n",
fname, y, x,
msg_class_str, msg_id, msg_text )
);
}
/*
* message_ref
*
* hsc-callback to display ref-message coming from parser
*/
static VOID message_ref(HSCPRC *hp,
HSCMSG_CLASS msg_class, HSCMSG_ID msg_id,
STRPTR fname, ULONG x, ULONG y,
STRPTR msg_text)
{
if ( msg_text && msg_text[0] )
message( hp, msg_class, msg_id, fname, x, y, msg_text );
else
message( hp, msg_class, msg_id, fname, x, y,
"(location of previous call)");
}
static VOID do_hsc_id( HSCPRC *hp, HSCATTR *attr, STRPTR id )
{
#if 0
fprintf( stderr, "new id : `%s' for attr `%s'\n",
id, attr->name );
#endif
}
/*
* do_hsc_start_tag
*
* hsc-callback for processing start tag
*/
static VOID do_hsc_start_tag( HSCPRC *hp, HSCTAG *tag, STRPTR tag_name, STRPTR tag_attr, STRPTR tag_close )
{
#if 0
if ( tag )
fprintf( stderr, "start tag: <%s>\n", tag->name );
else
fprintf( stderr, "start tag: <UNKNOWN>\n" );
#endif
append_output( tag_name );
append_output( tag_attr );
append_output( tag_close );
}
static VOID do_hsc_end_tag( HSCPRC *hp, HSCTAG *tag, STRPTR tag_name, STRPTR tag_attr, STRPTR tag_close )
{
#if 0
if ( tag )
fprintf( stderr, "end tag : </%s>\n", tag->name );
else
fprintf( stderr, "start tag: <UNKNOWN>\n" );
#endif
append_output( tag_name );
append_output( tag_attr );
append_output( tag_close );
}
static VOID do_hsc_text( HSCPRC *hp, STRPTR whtspc, STRPTR text )
{
#if 0
fprintf( stderr, "text : \"%s\", \"%s\"\n", whtspc, text );
#endif
append_output( whtspc );
append_output( text );
}
/*
* init_callback
*
* assign hsc's callbacks to a hsc-process
*/
BOOL init_callback( HSCPRC *hp )
{
/* status-messages */
hsc_set_status_file_begin( hp, status_file_begin );
hsc_set_status_file_end( hp, status_file_end );
hsc_set_status_line( hp, status_line );
hsc_set_status_misc( hp, status_misc );
/* messages */
hsc_set_message( hp, message );
hsc_set_message_ref( hp, message_ref );
/* processing tags & text */
hsc_set_start_tag( hp, do_hsc_start_tag );
hsc_set_end_tag( hp, do_hsc_end_tag );
hsc_set_id( hp, do_hsc_id );
hsc_set_text( hp, do_hsc_text );
return( TRUE );
}
/*
* message file functiuons
*/
/*
* init_msg_file
*
* open messagefile or assign it to stdderr
*/
BOOL init_msgfile( HSCPRC *hp, STRPTR fname )
{
BOOL ok = TRUE;
if ( fname )
{
D( fprintf( stderr, DHSC "write msg to `%s'\n", fname ) );
errno = 0;
msgfile = fopen( fname, "w" );
if ( !msgfile )
{
#define MSGBUFLEN 79
STRARR msgbuf[ MSGBUFLEN+1 ];
strncpy( msgbuf, "unable to open message file `", MSGBUFLEN );
strncat( msgbuf, fname , MSGBUFLEN - strlen(msgbuf) );
strncat( msgbuf, "': " , MSGBUFLEN - strlen(msgbuf) );
strncat( msgbuf, strerror( errno ) , MSGBUFLEN - strlen(msgbuf) );
status_error( msgbuf );
ok = FALSE;
}
}
else
{
msgfile = stderr;
D( fprintf( stderr, DHSC "write msg to <stderr>\n" ) );
}
return( ok );
}
/*
* cleanup_msg_file
*
* close message file if neccessary
*/
VOID cleanup_msgfile( VOID )
{
if ( msgfile && (msgfile != stderr) )
fclose( msgfile );
}